import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Array;
import java.util.*;

/**
 * Created by dllo on 18/5/14.
 */
@WebServlet(name = "AServlet", urlPatterns = "/a")
public class AServlet extends HttpServlet {
    /**
     * Get请求和Post请求的异同
     * 1.Get请求和Post请求都是http协议规定的请求方式之一
     * Get请求更偏向于从服务器获取数据,而不会修改服务器中已有的数据
     * post请求更偏向于向服务器发送数据
     * 2.Get请求 请求参数拼接在URL后,使用问好隔开
     * Post请求 请求参数 放在 请求体中
     * 但是无论哪种方式,参数的格式和内容 都是一样的
     * 每一个参数使用 key=value的形式
     * 多个参数之间 使用%进行连接
     * 3.由于Get请求的参数 是放在URL上的,又因为URL是有长度限制的
     * 所以Get请求不能发送过大的数据
     * 而Post请求,由于是参数放入请求体,就没有长度限制了
     * 可以用来上传文件
     * 4.关于安全,Get和Post一样 都不安全,因为http协议本身就是不安全的
     */
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 对request 和response 的操作是不分 get/post请求的
        resp.setContentType("text/html;charset=utf-8");
        // 使用utf-8 来解析body中的参数
        req.setCharacterEncoding("utf-8");
        // 获取参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String gender = req.getParameter("gender");
        // 获取向checkbox这种 一个name对应多个value的参数
        // 需要要使用该方法,返回值是string数组
        String[] hobbise = req.getParameterValues("hobby");

        PrintWriter pw = resp.getWriter();
        pw.println("用户名:" + username);
        pw.println("密码:" + password);
        pw.println("性别:" + gender);
        pw.println("爱好:" + Arrays.toString(hobbise));

        // 获取所有请求的参数
        // enumeration 这个对象 可以像resultSet一样使用
        //只有两个方法
        // hasMorElements:是否还有没遍历的元素
        // nextElement: 下一个元素
        Enumeration<String> parameterNames = req.getParameterNames();

        while (parameterNames.hasMoreElements()) {
            String name = parameterNames.nextElement();
            pw.println(name);
        }

        // 获取所有的参数信息,以map的形式
        // key就是参数的name
        // value就是参数的value
        Map<String, String[]> map = req.getParameterMap();
        // 获取所有的key,组成一个set 集合
        Set<String> keySet = map.keySet();
        for (String key : keySet) {
            // 为了照顾 像checkbox这样的
            // 多个value的情况,所以,value是一个数组
            String[] values = map.get(key);
            // 看出效果
            pw.println(key + ":" + Arrays.toString(values));
        }
// 迭代器方法
//        Iterator<String> iterator = keySet.iterator();
//        while (iterator.hasNext()) {
//            String key = iterator.next();
//        }
    }
}
